/**
 * 轮播图管理控制器模块
 * 
 * 处理轮播图增删改查(CRUD)操作的业务逻辑
 */
const BannerService = require('../services/banner.service');
const CustomError = require('../utils/CustomError');
const logger = require('../utils/logger');

async function getAllBanners(req, res) {
  logger.debug("获取轮播图列表");
  // 从查询参数中获取show参数
  const { show } = req.query;
  
  // 处理show参数
  let showValue;
  if (show !== undefined) {
    if (show === 'true') {
      showValue = true;
    } else if (show === 'false') {
      showValue = false;
    } else {
      throw new CustomError(400, 'show参数错误，应为true或false');
    }
  }

  // 从服务层获取轮播图列表
  const banners = await BannerService.getAllBanners(showValue);

  // 返回结果
  res.json({
    code: 200,
    message: "获取轮播图列表成功",
    data: banners.map((banner) => banner.toJSON())
  });
}

async function getBannerById (req, res) {
  // 从请求参数中获取轮播图id
  const id = req.params.id;

  logger.debug(`获取轮播图 ID: ${id}`);
  // 调用轮播图服务层，获取轮播图信息
  const banner = await BannerService.getBannerById(id);

  // 业务上可预期的错误，我们需要优雅地处理
  // 如果轮播图不存在，抛出404错误
  if (!banner) {
    throw new CustomError(404, '轮播图不存在');
  }
     
  res.json(
    { 
      code: 200,
      message: "获取轮播图信息成功",
      data: banner.toJSON() 
    }
  );
}

async function createBanner (req, res) {
  // 打印请求参数
  logger.debug("创建轮播图");
  logger.debug("请求体", req.body);
  // 从请求参数中获取轮播图信息
  const { 
    imgUrl,
    title,
    targetUrl,
    sortOrder,
    show
  } = req.body;

  // 校验必要参数
  if (!imgUrl || imgUrl.trim() === "" || imgUrl.length > 255) {
    throw new CustomError(400, '图片URL不能为空，且不能超过255个字符');
  }

  if (!title || title.trim() === "" || title.length > 100) {
    throw new CustomError(400, '图片标题不能为空，且不能超过100个字符');
  }

  // 对数据进行处理
  let showValue = show;
  if (show !== undefined && show !== true && show !== false) {
    throw new CustomError(400, '显示状态参数错误');
  }
  
  // 确保show值为数字格式（数据库中存储为TINYINT）
  if (showValue === undefined) {
    showValue = true;
  }

  // 调用轮播图服务层，创建轮播图
  const banner = await BannerService.createBanner({
    imgUrl,
    title,
    targetUrl: targetUrl || null,
    sortOrder: sortOrder || 0,
    show: showValue
  });

  // 状态201表示资源创建成功，返回创建的轮播图信息
  res.status(200).json(
    { 
      code: 201,
      message: "轮播图创建成功",
      data: banner.toJSON() 
    }
  )
}

async function updateBanner (req, res)  {
  logger.debug("更新轮播图");
  logger.debug("请求体", req.body);
  // 从请求参数中获取轮播图信息
  const { id } = req.params;

  // 这些参数由接口文档规定，一般由后端开发人员和前端开发人员协商确定
  const { 
    imgUrl,
    title,
    targetUrl,
    sortOrder,
    show
  } = req.body;
  
  // 从服务层获取轮播图信息
  let banner = await BannerService.getBannerById(id);
  if (!banner) {
    throw new CustomError(404, '轮播图不存在');
  }
  
  // 校验参数
  if (imgUrl !== undefined && (imgUrl === null || imgUrl === "" || imgUrl.length > 255)) {
    throw new CustomError(400, '图片URL不能为空，且不能超过255个字符');
  }

  if (title !== undefined && (title === null || title === "" || title.length > 100)) {
    throw new CustomError(400, '图片标题不能为空，且不能超过100个字符');
  }

  // 对数据进行处理
  let showValue;
  if (show !== undefined) {
    if (show === true || show === false) {
      showValue = show ? 1 : 0;
    } else {
      throw new CustomError(400, '显示状态参数错误');
    }
  }

  // 更新轮播图信息
  if (imgUrl !== undefined) banner.imgUrl = imgUrl;
  if (title !== undefined) banner.title = title;
  if (targetUrl !== undefined) banner.targetUrl = targetUrl;
  if (sortOrder !== undefined) banner.sortOrder = sortOrder;
  if (showValue !== undefined) banner.show = showValue;

  // 调用轮播图服务层，更新轮播图信息
  banner = await BannerService.updateBanner(banner);

  logger.debug("更新后的轮播图信息:");
  logger.debug(banner);
  
  // 返回更新后的轮播图信息
  res.json(
    { 
      code: 200,
      message: "轮播图更新成功",
      data: banner.toJSON() 
    }
  );
}

async function deleteBanner(req, res){
  logger.debug("删除轮播图");
  logger.debug("请求参数", req.params);
  // 从请求参数中获取轮播图id
  const { id } = req.params;

  // 从服务层获取轮播图信息
  const banner = await BannerService.getBannerById(id);

  if (!banner) {
    throw new CustomError(404, '轮播图不存在');
  }

  // 调用轮播图服务层，删除轮播图
  await BannerService.deleteBannerById(id);
  // 返回结果
  res.json({
    code: 200,
    message: "轮播图删除成功"
  });
}

module.exports = {
  // 导出轮播图控制器方法
  getAllBanners,
  getBannerById,
  createBanner,
  updateBanner,
  deleteBanner
}